home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / include / madwifi / net80211 / ieee80211_scan.h < prev    next >
C/C++ Source or Header  |  2006-05-11  |  9KB  |  222 lines

  1. /*-
  2.  * Copyright (c) 2005 Sam Leffler, Errno Consulting
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. The name of the author may not be used to endorse or promote products
  14.  *    derived from this software without specific prior written permission.
  15.  *
  16.  * Alternatively, this software may be distributed under the terms of the
  17.  * GNU General Public License ("GPL") version 2 as published by the Free
  18.  * Software Foundation.
  19.  *
  20.  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  21.  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  22.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  23.  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  24.  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  25.  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  26.  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  27.  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  28.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  29.  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  30.  *
  31.  * $Id: ieee80211_scan.h 1441 2006-02-06 16:03:21Z mrenzmann $
  32.  */
  33. #ifndef _NET80211_IEEE80211_SCAN_H_
  34. #define _NET80211_IEEE80211_SCAN_H_
  35.  
  36. #define    IEEE80211_SCAN_MAX    IEEE80211_CHAN_MAX
  37.  
  38. struct ieee80211_scanner;
  39.  
  40. struct ieee80211_scan_ssid {
  41.     int len;                    /* length in bytes */
  42.     u_int8_t ssid[IEEE80211_NWID_LEN];    /* ssid contents */
  43. };
  44. #define    IEEE80211_SCAN_MAX_SSID    1
  45.  
  46. struct ieee80211_scan_state {
  47.     struct ieee80211vap *ss_vap;
  48.     const struct ieee80211_scanner *ss_ops;    /* policy hookup, see below */
  49.     void *ss_priv;                /* scanner private state */
  50.     u_int16_t ss_flags;
  51. #define    IEEE80211_SCAN_NOPICK    0x0001        /* scan only, no selection */
  52. #define    IEEE80211_SCAN_ACTIVE    0x0002        /* active scan (probe req) */
  53. #define    IEEE80211_SCAN_PICK1ST    0x0004        /* ``hey sailor'' mode */
  54. #define    IEEE80211_SCAN_BGSCAN    0x0008        /* bg scan, exit ps at end */
  55. #define    IEEE80211_SCAN_ONCE    0x0010        /* do one complete pass */
  56. #define    IEEE80211_SCAN_GOTPICK    0x1000        /* got candidate, can stop */
  57.  
  58.     u_int8_t    ss_nssid;            /* # ssid's to probe/match */
  59.     struct ieee80211_scan_ssid ss_ssid[IEEE80211_SCAN_MAX_SSID];
  60.                         /* ssid's to probe/match */
  61.                         /* ordered channel set */
  62.     struct ieee80211_channel *ss_chans[IEEE80211_SCAN_MAX];
  63.     u_int16_t ss_next;            /* ix of next chan to scan */
  64.     u_int16_t ss_last;            /* ix + 1 of last chan to scan */
  65.     unsigned long ss_mindwell;        /* min dwell on channel */
  66.     unsigned long ss_maxdwell;        /* max dwell on channel */
  67.     u_int ss_duration;            /* used for calling ieee80211_start_scan() */
  68. };
  69.  
  70. /*
  71.  * The upper 16 bits of the flags word is used to communicate
  72.  * information to the scanning code that is NOT recorded in
  73.  * ss_flags.  It might be better to split this stuff out into
  74.  * a separate variable to avoid confusion.
  75.  */
  76. #define    IEEE80211_SCAN_FLUSH    0x10000        /* flush candidate table */
  77. #define    IEEE80211_SCAN_NOSSID    0x20000        /* don't update ssid list */
  78. #define    IEEE80211_SCAN_USECACHE    0x40000        /* Must use a result from the cache */
  79. #define    IEEE80211_SCAN_KEEPMODE    0x80000        /* Must keep the same wireless mode (11a, 11g, or 11at, etc) */
  80.  
  81. struct ieee80211com;
  82. void ieee80211_scan_attach(struct ieee80211com *);
  83. void ieee80211_scan_detach(struct ieee80211com *);
  84. void ieee80211_scan_vattach(struct ieee80211vap *);
  85. void ieee80211_scan_vdetach(struct ieee80211vap *);
  86.  
  87. void ieee80211_scan_dump_channels(const struct ieee80211_scan_state *);
  88.  
  89. #define    IEEE80211_SCAN_FOREVER    0x7fffffff
  90. int ieee80211_start_scan(struct ieee80211vap *, int, u_int, u_int,
  91.     const struct ieee80211_scan_ssid ssids[]);
  92. int ieee80211_check_scan(struct ieee80211vap *, int, u_int, u_int,
  93.     const struct ieee80211_scan_ssid ssids[],
  94.     int (*action)(struct ieee80211vap *, const struct ieee80211_scan_entry *));
  95. int ieee80211_bg_scan(struct ieee80211vap *);
  96. void ieee80211_cancel_scan(struct ieee80211vap *);
  97.  
  98. int ieee80211_scan_dfs_action(struct ieee80211vap *, const struct ieee80211_scan_entry *);
  99.  
  100. struct ieee80211_scanparams;
  101. void ieee80211_add_scan(struct ieee80211vap *, const struct ieee80211_scanparams *,
  102.     const struct ieee80211_frame *, int, int, int);
  103. void ieee80211_scan_timeout(struct ieee80211com *);
  104.  
  105. void ieee80211_scan_assoc_success(struct ieee80211com *,
  106.     const u_int8_t mac[IEEE80211_ADDR_LEN]);
  107. enum {
  108.     IEEE80211_SCAN_FAIL_TIMEOUT    = 1,    /* no response to mgmt frame */
  109.     IEEE80211_SCAN_FAIL_STATUS    = 2    /* negative response to " " */
  110. };
  111. void ieee80211_scan_assoc_fail(struct ieee80211com *,
  112.     const u_int8_t mac[IEEE80211_ADDR_LEN], int);
  113. void ieee80211_scan_flush(struct ieee80211com *);
  114.  
  115. struct ieee80211_scan_entry;
  116. typedef void ieee80211_scan_iter_func(void *, const struct ieee80211_scan_entry *);
  117. void ieee80211_scan_iterate(struct ieee80211com *, ieee80211_scan_iter_func, void *);
  118.  
  119. /*
  120.  * Parameters supplied when adding/updating an entry in a
  121.  * scan cache.  Pointer variables should be set to NULL
  122.  * if no data is available.  Pointer references can be to
  123.  * local data; any information that is saved will be copied.
  124.  * All multi-byte values must be in host byte order.
  125.  */
  126. struct ieee80211_scanparams {
  127.     u_int16_t capinfo;    /* 802.11 capabilities */
  128.     u_int16_t fhdwell;    /* FHSS dwell interval */
  129.     u_int8_t chan;        /* */
  130.     u_int8_t bchan;
  131.     u_int8_t fhindex;
  132.     u_int8_t erp;
  133.     u_int8_t bintval;
  134.     u_int8_t timoff;
  135.     u_int8_t *tim;
  136.     u_int8_t *tstamp;
  137.     u_int8_t *country;
  138.     u_int8_t *ssid;
  139.     u_int8_t *rates;
  140.     u_int8_t *xrates;
  141.     u_int8_t *doth;
  142.     u_int8_t *wpa;
  143.     u_int8_t *rsn;
  144.     u_int8_t *wme;
  145.     u_int8_t *ath;
  146. };
  147.  
  148. /*
  149.  * Scan cache entry format used when exporting data from a policy
  150.  * module; this data may be represented some other way internally.
  151.  */
  152. struct ieee80211_scan_entry {
  153.     u_int8_t se_macaddr[IEEE80211_ADDR_LEN];
  154.     u_int8_t se_bssid[IEEE80211_ADDR_LEN];
  155.     u_int8_t se_ssid[2 + IEEE80211_NWID_LEN];
  156.     u_int8_t se_rates[2 + IEEE80211_RATE_MAXSIZE];
  157.     u_int8_t se_xrates[2 + IEEE80211_RATE_MAXSIZE];
  158.     u_int32_t se_rstamp;        /* recv timestamp */
  159.     union {
  160.         u_int8_t data[8];
  161.         u_int64_t tsf;
  162.     } se_tstamp;            /* from last rcv'd beacon */
  163.     u_int16_t se_intval;        /* beacon interval (host byte order) */
  164.     u_int16_t se_capinfo;        /* capabilities (host byte order) */
  165.     struct ieee80211_channel *se_chan;/* channel where sta found */
  166.     u_int16_t se_timoff;        /* byte offset to TIM ie */
  167.     u_int16_t se_fhdwell;        /* FH only (host byte order) */
  168.     u_int8_t se_fhindex;        /* FH only */
  169.     u_int8_t se_erp;            /* ERP from beacon/probe resp */
  170.     int8_t se_rssi;            /* avg'd recv ssi */
  171.     u_int8_t se_dtimperiod;        /* DTIM period */
  172.     u_int8_t *se_wpa_ie;        /* captured WPA ie */
  173.     u_int8_t *se_rsn_ie;        /* captured RSN ie */
  174.     u_int8_t *se_wme_ie;        /* captured WME ie */
  175.     u_int8_t *se_ath_ie;        /* captured Atheros ie */
  176.     u_int se_age;            /* age of entry (0 on create) */
  177. };
  178.  
  179. /*
  180.  * Template for an in-kernel scan policy module.
  181.  * Modules register with the scanning code and are
  182.  * typically loaded as needed.
  183.  */
  184. struct ieee80211_scanner {
  185.     const char *scan_name;        /* printable name */
  186.     int (*scan_attach)(struct ieee80211_scan_state *);
  187.     int (*scan_detach)(struct ieee80211_scan_state *);
  188.     int (*scan_start)(struct ieee80211_scan_state *, struct ieee80211vap *);
  189.     int (*scan_restart)(struct ieee80211_scan_state *, struct ieee80211vap *);
  190.     int (*scan_cancel)(struct ieee80211_scan_state *, struct ieee80211vap *);
  191.     int (*scan_end)(struct ieee80211_scan_state *, struct ieee80211vap *,
  192.         int (*action)(struct ieee80211vap *, const struct ieee80211_scan_entry *),
  193.         u_int32_t);
  194.     int (*scan_flush)(struct ieee80211_scan_state *);
  195.     /* add an entry to the cache */
  196.     int (*scan_add)(struct ieee80211_scan_state *,
  197.         const struct ieee80211_scanparams *,
  198.         const struct ieee80211_frame *, int, int, int);
  199.     /* age and/or purge entries in the cache */
  200.     void (*scan_age)(struct ieee80211_scan_state *);
  201.     /* note that association failed for an entry */
  202.     void (*scan_assoc_fail)(struct ieee80211_scan_state *,
  203.         const u_int8_t macaddr[IEEE80211_ADDR_LEN], int);
  204.     /* note that association succeed for an entry */
  205.     void (*scan_assoc_success)(struct ieee80211_scan_state *,
  206.         const u_int8_t macaddr[IEEE80211_ADDR_LEN]);
  207.     /* iterate over entries in the scan cache */
  208.     void (*scan_iterate)(struct ieee80211_scan_state *,
  209.         ieee80211_scan_iter_func *, void *);
  210.     /* default action to take when found scan match */
  211.     int (*scan_default)(struct ieee80211vap *,
  212.         const struct ieee80211_scan_entry *);
  213. };
  214. const struct ieee80211_scanner *ieee80211_scanner_get(enum ieee80211_opmode,
  215.     int);
  216. void ieee80211_scanner_register(enum ieee80211_opmode,
  217.     const struct ieee80211_scanner *);
  218. void ieee80211_scanner_unregister(enum ieee80211_opmode,
  219.     const struct ieee80211_scanner *);
  220. void ieee80211_scanner_unregister_all(const struct ieee80211_scanner *);
  221. #endif /* _NET80211_IEEE80211_SCAN_H_ */
  222.